#include "ConfigurerNiveaux.h"

#include "debugstreams.h"
#include "Joueur.h"
#include "Classe.h"
#include "Race.h"
#include "Parser.h"

/**
 * @addtogroup Utilitaires
 * @{
 */

/**
 *
 * Sert à fixer les différents niveaux de sorties des fonctions en
 * lisant le fichier CONFIG, placé dans le répertoire courant.\n
 *
 * Si le fichier a été déplacé ou n'est pas présent, les réglages par
 * défaut seront appliqué et un message d'erreur envoyé à la sortie
 * standard.
 *
 */
void lireNiveauxSortie()
{
  const unsigned int nbr_niveaux = 12;
  string test[13] = {
    "ALL", "MEM", "DEBUG", "LFUNC", "LINFO", "FUNC", "INFO", "BLANK",
    "PROGRESS", "RELEASE", "WARN", "ERR", "OFF" };
  string a_trouver[nbr_niveaux] = { 
    "Debug::itsLevel", "Joueur::interne", "Joueur::fonction_elementaire_xml",
    "Joueur::fonction_recuperation_xml", "Joueur::fonction_tex",
    "Race::elementaire", "Race::fonction", "Classe::elementaire",
    "Classe::fonction", "Parser::elementaire", "Parser::fonction",
    "ElementDOM::elementaire" };
  string ligne, level;
  unsigned int i, j;
  size_t loc;
  
  ifstream entree;
  entree.open("CONFIG");
  if (entree.fail())
    {
      warning() << "Réglages par défaut appliqués, fichier de configuration illisible" << endreq;
      return;
    }

  while(!entree.eof())
    {
      getline(entree, ligne);

      if ( ligne == "" ) continue;

      for (i = 0; i < nbr_niveaux; i++)
	{
	  level = "";
	  loc = ligne.find(a_trouver[i], 0);
	  if (loc != string::npos)
	    {
	      j = ligne.size() - 1;
	      while(ligne[j] != ' ')
		{
		  level = ligne[j] + level;
		  j--;
		}
	      for (j = 0; j < 13; j++)
		{
		  if (test[j] == level)
		    break;
		}
	      switch(i)
		{
		case 0:
		  dout.setLevel( (DebugLevelType) j );
		  break;
		case 1:
		case 2:
		case 3:
		case 4:
		  Joueur::setLevel( (DebugLevelType) j, i );
		  break;
		case 5:
		case 6:
		  Race::setLevel( (DebugLevelType) j, i - 4 );
		  break;
		case 7:
		case 8:
		  Classe::setLevel( (DebugLevelType) j, i - 6 );
		  break;
		case 9:
		case 10:
		  Parser::setLevel( (DebugLevelType) j, i - 9 );
		  break;
		case 11:
		  ElementDOM::setLevel( (DebugLevelType) j );
		  break;
		}
	      debug() << a_trouver[i] << ' ' << level << endreq;
	      break;
	    }
	}
    }

  entree.close();
}

/**
 * \}
 */
